#ifndef __DHT11_H
#define __DHT11_H


#include "stm32f10x.h"                  // Device header
#include "uart.h"

// dht11引脚配置
#define dht_port    GPIOA
#define dht_pin     GPIO_Pin_8

/*
    dht11驱动函数
    作者:YSS
    日期:2024-9-7
*/


// 定义DHT11使用的引脚
#define DHT11_Port  GPIOA
#define DHT11_Pin   GPIO_Pin_8
// 引脚时钟初始化
#define DHT11_CLK_ENABLE() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);}

// 引脚模式配置
#define DHT_OUT()  {GPIOA->CRH &=~(15<<(4*0)); GPIOA->CRH |= 3<<(4*0);} // 推挽输出
#define DHT_IN()   {GPIOA->CRH &=~(15<<(4*0)); GPIOA->CRH |= 8<<(4*0);} // 上拉输入

// 引脚输出高低电平
#define DHT_PIN_H() {GPIO_WriteBit(DHT11_Port,DHT11_Pin,Bit_SET);}
#define DHT_PIN_L() {GPIO_WriteBit(DHT11_Port,DHT11_Pin,Bit_RESET);}
// 读引脚
#define DHT_PIN_READ GPIO_ReadInputDataBit(DHT11_Port,DHT11_Pin)

// DHT11接收的数据帧
typedef struct node
{
    uint8_t HUMI_INT; // 湿度整数
    uint8_t HUMI_DEC; // 湿度小数
    uint8_t TEMP_INT; // 温度整数
    uint8_t TEMP_DEC; // 温度小数
    uint8_t CRC_NUM;     // 校验和
}DHT_DAT;


void DHT11_Init(void);
uint8_t DHT11_Start(void);
uint8_t DHT_ReadBit(void);
uint8_t DHT_ReadByte(void);
uint8_t DHT_GetValue(DHT_DAT *Val);


#endif

